/**
 * Generali Solutions d'assurances - Tous droits réservés &copy; 2007 - 2010
 */
package fr.generali.accueilclient.utils.jaxb;

import javax.xml.bind.JAXBContext;
import javax.xml.bind.JAXBElement;
import javax.xml.bind.JAXBException;
import javax.xml.bind.Unmarshaller;
import javax.xml.bind.util.JAXBSource;
import javax.xml.namespace.QName;

/**
 * @author Holmes Kelly
 */
public final class JAXBConvertUtils {

    /**
     * constructeur par defaut
     */
    private JAXBConvertUtils() {

    }

    /**
     * @param <S> objet source parametre
     * @param <T> objet target parametre
     * @param source objet source
     * @param classSource declared type source
     * @param classTarget declared type target
     * @return T
     * @throws JAXBException exception jaxb
     */
    public static <S, T> T convertBean(S source, Class<S> classSource, Class<T> classTarget) throws JAXBException {

        JAXBContext contextSource = JAXBContext.newInstance(classSource);

        JAXBElement<S> jaxbElementSource =
                        new JAXBElement<S>(new QName(classSource.getSimpleName()), classSource, source);

        JAXBSource jaxbSourceSource = new JAXBSource(contextSource, jaxbElementSource);

        JAXBContext contextTarget = JAXBContext.newInstance(classTarget);
        Unmarshaller unmarshallerTarget = contextTarget.createUnmarshaller();

        JAXBElement<T> jaxbElementTarget = unmarshallerTarget.unmarshal(jaxbSourceSource, classTarget);

        return jaxbElementTarget.getValue();

    }
}
